home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / Other Langs / python / Lib / stdwin / WindowSched.py < prev   
Encoding:
Text File  |  1994-04-01  |  1.3 KB  |  59 lines  |  [TEXT/R*ch]

  1. # Combine a real-time scheduling queue and stdwin event handling.
  2. # Uses the millisecond timer.
  3.  
  4. import stdwin, stdwinq
  5. from stdwinevents import WE_TIMER
  6. import mainloop
  7. import sched
  8. import time
  9.  
  10. # Delay function called by the scheduler when it has nothing to do.
  11. # Return immediately when something is done, or when the delay is up.
  12. #
  13. def delayfunc(msecs):
  14.     #
  15.     # Check for immediate stdwin event
  16.     #
  17.     event = stdwinq.pollevent()
  18.     if event:
  19.         mainloop.dispatch(event)
  20.         return
  21.     #
  22.     # Use millisleep for very short delays or if there are no windows
  23.     #
  24.     if msecs < 100 or mainloop.countwindows() == 0:
  25.         if msecs > 0:
  26.             time.millisleep(msecs)
  27.         return
  28.     #
  29.     # Post a timer event on an arbitrary window and wait for it
  30.     #
  31.     window = mainloop.anywindow()
  32.     window.settimer(msecs/100)
  33.     event = stdwinq.getevent()
  34.     window.settimer(0)
  35.     if event[0] <> WE_TIMER:
  36.         mainloop.dispatch(event)
  37.  
  38. q = sched.scheduler(time.millitimer, delayfunc)
  39.  
  40. # Export functions enter, enterabs and cancel just like a scheduler
  41. #
  42. enter = q.enter
  43. enterabs = q.enterabs
  44. cancel = q.cancel
  45.  
  46. # Emptiness check must check both queues
  47. #
  48. def empty():
  49.     return q.empty() and mainloop.countwindows() == 0
  50.  
  51. # Run until there is nothing left to do
  52. #
  53. def run():
  54.     while not empty():
  55.         if q.empty():
  56.             mainloop.dispatch(stdwinq.getevent())
  57.         else:
  58.             q.run()
  59.